\subsubsection{MSVC: x86-64}

\myindex{x86-64}
Wypróbujmy również 64-bitowy MSVC:

\lstinputlisting[caption=MSVC 2012 x64,style=customasmx86]{patterns/01_helloworld/MSVC_x64.asm}

\myindex{fastcall}

W x86-64 wszystkie rejestry zostały rozszerzone do 64-ch bit i mają teraz prefiks \TT{R-}.
Żeby jak najrzadziej korzystać ze stosu (inaczej mówiąc, jak najmniej korzystać z pamięci cache i pamięci zewnętrznej), od dawna istniała dosyć popularna metoda przekazywania argumentów funkcji przez rejestry (\IT{fastcall}) \myref{fastcall}.
Tzn część argumentów funkcji jest przekazywana przez rejestry i część --- przez stos.
W Win64 pierwsze 4 argumenty funkcji są przekazywane przez rejestry \RCX, \RDX, \Reg{8}, \Reg{9}.
Właśnie to tutaj widzimy: wskaźnik na linię \printf teraz jest przekazywany nie przez stos, a przez rejestr \RCX.
Wskaźniki teraz są 64-bitowe, także są one przekazywane przez 64-bitowe części rejestrów (mające prefiks \TT{R-}).
Ale dla wstecznej kompatybilności można adresować również młodsze 32 bity rejestrów poprzez prefiks \TT{E-}.
W ten o to sposób wygląda rejestr \RAX/\EAX/\AX/\AL w x86-64:

\RegTableOne{RAX}{EAX}{AX}{AH}{AL}

Funkcja \main zwraca wartość typu \Tint, który w \CCpp, dla większej kompatybilności,
zostawili 32-bitowym. Właśnie dlatego na końcu f-cji \main zeruje się nie \RAX, a \EAX, czyli 32-bitowa część rejestru.
Także widać, że 40 bajt są przydzielane na stosie lokalnym.
Jest to \q{shadow space} które będzie omawiane później: \myref{shadow_space}.

